package com.zxy.ziems.server.energy.mapper;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.zxy.ziems.server.board.pojo.vo.DosageVo;
import com.zxy.ziems.server.domain.DeviceMeasureData;
import com.zxy.ziems.server.dto.DeviceMeasureDataExtendDTO;
import com.zxy.ziems.server.dto.DeviceMeasureDateGroupDto;
import com.zxy.ziems.server.energy.pojo.dto.ClassifyDeviceEleDTO;
import com.zxy.ziems.server.energy.pojo.dto.DeviceMeasureDateDTO;
import com.zxy.ziems.server.energy.pojo.param.DeviceMeasureDataPageParam;
import com.zxy.ziems.server.energy.pojo.param.DeviceMeasureDataQParam;
import com.zxy.ziems.server.mybatis.core.mapper.BaseMapperX;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.time.LocalDateTime;
import java.util.List;
import java.util.Set;

@Mapper
public interface DeviceMeasureDataMapper extends BaseMapperX<DeviceMeasureData> {


    List<DeviceMeasureDateDTO> getAvg(@Param("year") int year, @Param("start") LocalDateTime start, @Param("end") LocalDateTime end,
                                      @Param("deviceIds") List<String> deviceIds, @Param("dataTypeId") String dataTypeId,
                                      @Param("format") String format);

    List<DeviceMeasureDateDTO> getDayAvg(@Param("year") int year, @Param("start") LocalDateTime start, @Param("end") LocalDateTime end,
                                         @Param("deviceIds") List<String> deviceIds, @Param("dataTypeId") String dataTypeId,
                                         @Param("format") String format);


    List<DeviceMeasureDateDTO> getSum(@Param("year") int year, @Param("start") LocalDateTime start, @Param("end") LocalDateTime end,
                                      @Param("deviceIds") List<String> deviceIds, @Param("dataTypeId") String dataTypeId,
                                      @Param("format") String format);


    /**
     * 计算单位时间内，各个设备的能源
     *
     * @param year
     * @param start
     * @param end
     * @param deviceIds
     * @param dataTypeId
     * @param format
     * @return
     */
    List<DeviceMeasureDateGroupDto> getDeviceSum(@Param("year") int year, @Param("start") LocalDateTime start, @Param("end") LocalDateTime end,
                                                 @Param("deviceIds") List<String> deviceIds, @Param("dataTypeId") String dataTypeId,
                                                 @Param("format") String format, @Param("classifyIds") List<String> classifyIds);
    /**
     * 计算单位时间内，各个设备的能源
     *
     * @param year
     * @param start
     * @param end
     * @param deviceIds
     * @param dataTypeId
     * @param format
     * @return
     */
    List<DeviceMeasureDateGroupDto> getDeviceRealSum(@Param("year") int year, @Param("start") LocalDateTime start, @Param("end") LocalDateTime end,
                                                 @Param("deviceIds") List<String> deviceIds, @Param("dataTypeId") String dataTypeId,
                                                 @Param("format") String format, @Param("classifyIds") List<String> classifyIds);

    /**
     * 计算单位时间内，各个设备的能源
     *
     * @param year
     * @param start
     * @param end
     * @param deviceIds
     * @param dataTypeId
     * @param format
     * @return
     */
    List<DeviceMeasureDateGroupDto> getDeviceHourSum(@Param("year") int year, @Param("start") LocalDateTime start, @Param("end") LocalDateTime end,
                                                     @Param("deviceIds") List<String> deviceIds, @Param("dataTypeId") String dataTypeId,
                                                     @Param("format") String format, @Param("classifyIds") List<String> classifyIds);

    /**
     * 计算单位时间内，各个设备的能源
     *
     * @param year
     * @param start
     * @param end
     * @param deviceIds
     * @param dataTypeId
     * @param format
     * @return
     */
    List<DeviceMeasureDateGroupDto> getDeviceHourRealSum(@Param("year") int year, @Param("start") LocalDateTime start, @Param("end") LocalDateTime end,
                                                     @Param("deviceIds") List<String> deviceIds, @Param("dataTypeId") String dataTypeId,
                                                     @Param("format") String format, @Param("classifyIds") List<String> classifyIds);

    /**
     * 统计峰平谷用量
     *
     * @param start
     * @param end
     * @param deviceIds
     * @param dataTypeId
     * @param format
     * @return
     */
    List<ClassifyDeviceEleDTO> getDeviceTypeEle(@Param("start") LocalDateTime start, @Param("end") LocalDateTime end,
                                                @Param("deviceIds") List<String> deviceIds, @Param("dataTypeId") String dataTypeId,
                                                @Param("format") String format, @Param("classifyIds") List<String> classifyIds);

    /**
     * 计算单位时间内，各个设备的能源
     *
     * @param year
     * @param start
     * @param end
     * @param deviceIds
     * @param dataTypeId
     * @param format
     * @return
     */
    List<DeviceMeasureDateGroupDto> getDeviceHourAvg(@Param("year") int year, @Param("start") LocalDateTime start, @Param("end") LocalDateTime end,
                                                     @Param("deviceIds") List<String> deviceIds, @Param("dataTypeId") String dataTypeId,
                                                     @Param("format") String format, @Param("classifyIds") List<String> classifyIds);

    /**
     * 计算单位时间（半小时）内，各个设备的能源
     *
     * @param year
     * @param start
     * @param end
     * @param deviceIds
     * @param dataTypeId
     * @param format
     * @return
     */
    List<DeviceMeasureDateGroupDto> getDeviceHalfHourAvg(@Param("year") int year, @Param("start") LocalDateTime start, @Param("end") LocalDateTime end,
                                                     @Param("deviceIds") List<String> deviceIds, @Param("dataTypeId") String dataTypeId,
                                                     @Param("format") String format, @Param("classifyIds") List<String> classifyIds);

    /**
     * 计算单位时间内，各个设备的能源(所有采集值)
     *
     * @param year
     * @param start
     * @param end
     * @param deviceIds
     * @param dataTypeId
     * @param format
     * @return
     */
    List<DeviceMeasureDateGroupDto> listDeviceHour(@Param("start") LocalDateTime start, @Param("end") LocalDateTime end,
                                                   @Param("deviceIds") Set<String> deviceIds, @Param("dataTypeId") String dataTypeId,
                                                   @Param("classifyIds") List<String> classifyIds);

    /**
     * 计算单位时间内，各个设备的能源
     *
     * @param year
     * @param start
     * @param end
     * @param deviceIds
     * @param dataTypeId
     * @param format
     * @return
     */
    List<DeviceMeasureDateGroupDto> getDeviceAvg(@Param("year") int year, @Param("start") LocalDateTime start, @Param("end") LocalDateTime end,
                                                 @Param("deviceIds") List<String> deviceIds, @Param("dataTypeId") String dataTypeId,
                                                 @Param("format") String format, @Param("classifyIds") List<String> classifyIds);

    /* 分页查询
     * @param page
     * @param param
     * @return
     */
    IPage<DeviceMeasureData> queryPageListByDeviceId(@Param("page") IPage<DeviceMeasureData> page, @Param("param") DeviceMeasureDataPageParam param);

    /**
     * 获取最新数值
     *
     * @param deviceIds
     * @param dataTypeIds
     * @return
     */
    List<DosageVo> getLastVal(@Param("deviceIds") List<String> deviceIds, @Param("dataTypeIds") List<String> dataTypeIds);


    /**
     * 批量保存列表
     *
     * @param list
     */
    void batchSaveEntityList(List<DeviceMeasureData> list);

    IPage<DeviceMeasureDataExtendDTO> measureDataPageList(@Param("page") IPage<DeviceMeasureDataExtendDTO> page, @Param("param") DeviceMeasureDataQParam param);
}
